[Spring] - Spring Bean
Bean
์คํ๋ง ๋น์ ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ์๋ฐ ๊ฐ์ฒด(POJO; Plain Old Java Object)๋ฅผ ์๋ฏธํ๋ค.
IntelliJ๋ก ์คํ๋ง ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด @RestController
, @Service
๋ฑ์ ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ์ด๋
ธํ
์ด์
์ ๋ถ์ธ ํด๋์ค์ ์ผ์ชฝ์ ๋ณด๋ฉด ์กฐ๊ทธ๋งํ ์ฝฉ(๐ซ) ๊ฐ์๊ฑธ ๋ณผ ์ ์๋ค. ์ฆ, ํด๋น ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ ๋น์ ๋ฑ๋กํด์ ์ฌ์ฉํ๋ ๊ฒ์ผ๊น? ์ฐ๋ฆฌ๊ฐ @RestController
์ด๋
ธํ
์ด์
์ ๋นผ๊ณ ์คํํ๋ฉด, ํด๋น ์ปจํธ๋กค๋ฌ์ ์๋ API๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค. ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์คํ๊ณผ ๋น์ด ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง ์ดํด๋ณด์!
Spring Container
์คํ๋ง ์ปจํ ์ด๋์ ์ฃผ์ ์ญํ ์ ๋น์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ์์ฑ๋ ๋น์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ํ๋ค.
Spring Bean
์ด ์ถ๊ฐ๋๋ ๊ณต๊ฐ์ ๋ฐ๋ก Spring Container
๋ผ๋ ๊ณณ์ด๋ค.
์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ์ปจํ
์ด๋์ ๋น์ด ๋ฑ๋ก๋๋์ง ์ปจํ
์ด๋ ์์ฑ ๊ณผ์ ์ ๋ณด๋ฉด ์ดํดํ ์ ์๋ค.
0. ์ค์ ํ์ผ ์์ฑ
์ฐ๋ฆฌ๊ฐ ํํ PasswordEncoder
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ ์ฝ๋์ ๊ฐ์ด ๋ฑ๋กํ๋ค.
@Configuration
public class AppConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
}
์ด์ ๊ฐ์ด ๊ตฌ์ฑํ๋ ์ด์ ๋, ํด๋น ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํ๊ณ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค. ์ฆ, ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(), discountPolicy()
);
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
์ ์ฝ๋๋ฅผ ์์๋ก ์ด ์ค์ ํ์ผ์ด ์ด๋ค ๋ฐฉ์์ ๊ฑฐ์ณ์ ๋ฑ๋ก๋๋์ง ํ์ธํด๋ณด์!
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
ApplicationContext
๋ฅผ ์คํ๋ง ์ปจํ
์ด๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์์ ์์ฑํ AppConfig
์ ๋ํ ์ ๋ณด๋ฅผ AnnotationConfigApplicationContext
์๊ฒ ๋๊ฒจ์ค๋ค.
์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋, ์ปดํฌ๋ํธ ์ค์บ์ ํตํด @Configuration, @Component, @Service ๋ฑ๊ณผ ๊ฐ์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ปจํ ์ด๋์ ๋ด๋ ๊ฒ์ด๋ค.
// ApplicationContext ์ธํฐํ์ด์ค
// AnnotationConfigApplicationContext ๊ตฌํ์ฒด
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
์ ์ฝ๋๋ฅผ ํตํด ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์์ฑ๋๋ค.
์ฌ์ง๊ณผ ๊ฐ์ด ์คํ๋ง ๋น ์ ์ฅ์์ ์คํ๋ง์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํด๋๋ ๊ณณ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค!
2. ์คํ๋ง ๋น ๋ฑ๋ก
์คํ๋ง ์ปจํ
์ด๋๊ฐ ์์ฑ๋ ๋, ์์ AppConfig
์ ์์ฑํ๋ ์ฝ๋๋ฅผ ํ ๋๋ก ์คํ๋ง ๋น ์ ์ฅ์์ ๋ฑ๋ก์ ํ๊ฒ ๋๋ค.
์ด ๋, ๋ฉ์๋์ ์ด๋ฆ์ ๋น ์ด๋ฆ, ํด๋น ๋ฉ์๋์ ๋ฐํ ๊ฐ์ฒด๋ฅผ ๋น ๊ฐ์ฒด๋ก ๋ฑ๋กํ๋ค.
๋น์ ์ด๋ฆ์ ๋ฉ์๋๊ฐ ์๋ @Bean(name="...")
์ ํตํด์ ์ง์ ๋ถ์ฌํ ์ ์์ง๋ง, ์ ๋! ์ค๋ณต๋๋ ์ด๋ฆ์ผ๋ก ๋ถ์ฌํ๋ฉด ์ ๋๋ค. ๊ธฐ์กด ๋น์ ๋ฎ์ด๋ฒ๋ฆฌ๊ฑฐ๋, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
3. ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์
memberService
์์ memberRepository
๋ฅผ ์์กดํ๊ณ , orderService
์์ memberRepository
์ discountPolicy
๋ฅผ ์์กดํ๋ค.
์ด๋ ๊ฒ ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋๋ฐ, ์ด๋ฅผ DI(Dependency Injection)๋ผ๊ณ ํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ